package initialize

import (
	"fmt"
	"github.com/hashicorp/consul/api"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"mxshop-api/user-web/global"
	"mxshop-api/user-web/proto"
	_ "mxshop-api/user-web/utils/grpc-consul-resolver" // It's important
)

func InitSrvConn() {
	consulInfo := global.ServerConfig.ConsulInfo
	userConn, err := grpc.Dial(
		fmt.Sprintf("consul://%s:%d/%s?wait=14s&token=9bed74e4-1748-b21f-e871-2fca2dfabc5e", consulInfo.Host, consulInfo.Port, global.ServerConfig.UserSrvInfo.Name),
		grpc.WithTransportCredentials(insecure.NewCredentials()),
		grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`), // 轮询访问
	)
	if err != nil {
		zap.S().Fatalf("[user-web] 连接 【用户服务】 失败")
	}

	global.UserSrvClient = proto.NewUserClient(userConn)
}

func InitSrvConn2() {
	// 从注册中心获取到用户服务的信息
	cfg := api.DefaultConfig()
	cfg.Token = "9bed74e4-1748-b21f-e871-2fca2dfabc5e"
	consulInfo := global.ServerConfig.ConsulInfo
	cfg.Address = fmt.Sprintf("%s:%d", consulInfo.Host, consulInfo.Port)

	userSrvHost := ""
	userSrvport := 0
	client, err := api.NewClient(cfg)
	if err != nil {
		zap.S().Panic(err)
	}

	data, err := client.Agent().ServicesWithFilter(fmt.Sprintf(`Service == "%s"`, global.ServerConfig.UserSrvInfo.Name))
	if err != nil {
		zap.S().Panic(err)
	}
	for _, value := range data {
		userSrvHost = value.Address
		userSrvport = value.Port
		break
	}
	if userSrvHost == "" {
		zap.S().Fatal("[InitSrvConn] 连接 【用户服务】 失败")
		return
	}

	// 拨号连接用户 grpc 服务器 跨域的问题 - 后端解决(前端也可以解决)
	userConn, err := grpc.Dial(
		fmt.Sprintf("%s:%d", userSrvHost, userSrvport),
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	)
	if err != nil {
		zap.S().Errorw("[InitSrvConn] 连接 【用户服务】 失败", "msg", err.Error())
	}
	// 生成 grpc 的 client 调用接口
	// 1. 后续的用户服务下线了
	// 2. 改端口
	// 3. 改 ip
	// 好处: 已经事先创立好了连接, 这样后续就不用进行再次tcp的三次握手
	//
	global.UserSrvClient = proto.NewUserClient(userConn)
}
